package com.showsu.editor.utils.volcengine;

import com.alibaba.fastjson2.JSON;
import com.showsu.editor.entity.ai.AIXhsNoteKeywords;
import com.showsu.editor.entity.bigmodel.ChatCompletionsResponse;
import com.volcengine.ark.runtime.model.completion.chat.*;
import com.volcengine.ark.runtime.service.ArkService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: Johnplue
 * @Description: 火山方舟大模型服务平台工具类
 * @Date: Created in 14:02 下午 2024/11/28
 * @Modified By:
 */
@Slf4j
@Component
public class VolcengineArkUtil {
    private static final int timeout = 10000;

    @Value("${volcengine.ark.key}")
    private String key;

    @Value("${volcengine.ark.secret}")
    private String secret;

    private ArkService service;

    @PostConstruct
    public void init(){
        System.out.println("开始实例化 火山方舟大模型服务平台工具类");
        this.service= ArkService.builder()
                .ak(key)
                .sk(secret)
                .baseUrl("https://ark.cn-beijing.volces.com/api/v3/")
                .region("cn-beijing")
                .timeout(Duration.ofSeconds(120))
                .connectTimeout(Duration.ofSeconds(20))
                .retryTimes(2)
                .build();
        System.out.println("结束实例化 火山方舟大模型服务平台工具类");
    }

    @PreDestroy
    public void destroy() {
        this.service.shutdownExecutor();
        System.out.println("火山方舟大模型服务平台工具类 被销毁");
    }



    /**
     * 通过一个固定的模式分析xhs笔记内容，获得笔记关键词
     * @param content
     * @return
     */
    public List<AIXhsNoteKeywords> getXhsNoteKeywordsByAnalyzeContent(String content) {
        List<AIXhsNoteKeywords> result = new ArrayList<>();
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content("你是一个资深的小红书运营，你的任务是专业、准确地分析小红书笔记。").build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER)
                .content("请分析以下小红书笔记，给出3～5个笔记关键词并分别说明依据，按照关键词搜索量从高到低排序，无需分析过程\n" +
                "输出格式：\n" +
                "关键词：*\n" +
                "依据：*\n" +
                "以下为小红书笔记：\n\"\""+content+"\"\"").build();
        messages.add(systemMessage);
        messages.add(userMessage);

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model("ep-20241128112807-wbpx5")
                .messages(messages)
                .build();
        ChatCompletionResult chatCompletionResult=this.service.createChatCompletion(chatCompletionRequest);
        if (chatCompletionResult == null
                || CollectionUtils.isEmpty(chatCompletionResult.getChoices())
                || chatCompletionResult.getChoices().get(0) == null
                || chatCompletionResult.getChoices().get(0).getMessage() == null
                || chatCompletionResult.getChoices().get(0).getMessage().getContent() == null
                || StringUtils.isBlank(chatCompletionResult.getChoices().get(0).getMessage().getContent().toString())) {
            log.info("请求火山方舟大模型服务平台工具类获得笔记关键词，响应结果中没有message, content:{}, response:{}", userMessage.getContent(), chatCompletionResult);
            return null;
        }
        List<ChatCompletionChoice> chatCompletionChoices=chatCompletionResult.getChoices();
        StringBuilder sb=new StringBuilder();
        chatCompletionChoices
        .forEach(
                choice ->
                        sb.append(choice.getMessage().getContent())
        );
        String chatContent=sb.toString().replaceAll("\n", "");
        String[] chatContentArr = chatContent.split("关键词：");
        for(int i=0;i<chatContentArr.length;i++){
            if(StringUtils.isNotBlank(chatContentArr[i])){
                String[] t=chatContentArr[i].split("依据：");
                AIXhsNoteKeywords aiXhsNoteKeywords=new AIXhsNoteKeywords();
                aiXhsNoteKeywords.setKeyword(t[0]);
                if(t.length>1){
                    aiXhsNoteKeywords.setReason(t[1]);
                }
                result.add(aiXhsNoteKeywords);
            }

        }
        return result;
    }

    /**
     * 通过一个固定的模式分析xhs笔记内容，获得可能导致笔记限流和违规的违禁词
     * @param content
     * @return
     */
    public ChatCompletionsResponse getCheckTextByAnalyzeContent(String content) {
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content("作为一个小红书资深运营，你擅长从笔记找出全部的可能导致笔记限流和违规的违禁词，你的任务是为用户提供专业、准确、有见地的建议。").build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER)
                .content("\""+content + "\"\n\n" +
                        "请分析以上小红书笔记，是否存在可能导致笔记限流和违规的违禁词，仅罗列出相关违禁词并说明风险和修改建议，无需示例与总结，并按如下格式输出（注意：#标签不做分析）：\n" +
                        "\n" +
                        "### 可能的违禁词及风险分析\n" +
                        "\n" +
                        "1. **坠近**\n" +
                        "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                        "   - **修改建议**：改为标准用语“最近”。\n" +
                        "\n" +
                        "### 其他注意事项\n" +
                        "\n" +
                        "1. **坠近**\n" +
                        "   - **风险分析**：错别字或网络用语，可能影响平台内容质量。\n" +
                        "   - **修改建议**：改为标准用语“最近”。\n" +
                        "\n" +
                        "通过以上建议，可以进一步降低笔记被限流或违规的风险。").build();
        messages.add(systemMessage);
        messages.add(userMessage);

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model("ep-20241203114131-8shtn")
                .messages(messages)
                .build();
        ChatCompletionResult chatCompletionResult=this.service.createChatCompletion(chatCompletionRequest);
        if (chatCompletionResult == null
                || CollectionUtils.isEmpty(chatCompletionResult.getChoices())
                || chatCompletionResult.getChoices().get(0) == null
                || chatCompletionResult.getChoices().get(0).getMessage() == null
                || chatCompletionResult.getChoices().get(0).getMessage().getContent() == null
                || StringUtils.isBlank(chatCompletionResult.getChoices().get(0).getMessage().getContent().toString())) {
            log.info("请求火山方舟大模型服务平台工具类获得笔记关键词，响应结果中没有message, content:{}, response:{}", userMessage.getContent(), chatCompletionResult);
            return null;
        }
        ChatCompletionsResponse result=new ChatCompletionsResponse();
        result.setId(chatCompletionResult.getId());
        result.setCreated(chatCompletionResult.getCreated());
        result.setModel(chatCompletionResult.getModel());
        ChatCompletionsResponse.UsageDTO usageDTO=new ChatCompletionsResponse.UsageDTO();
        usageDTO.setPromptTokens(chatCompletionResult.getUsage().getPromptTokens());
        usageDTO.setCompletionTokens(chatCompletionResult.getUsage().getCompletionTokens());
        usageDTO.setTotalTokens(chatCompletionResult.getUsage().getTotalTokens());
        result.setUsage(usageDTO);
        List<ChatCompletionsResponse.ChoicesDTO> choicesDTOList=new ArrayList<>();
        chatCompletionResult.getChoices().forEach(chatCompletionChoice -> {
            ChatCompletionsResponse.ChoicesDTO choicesDTO=new ChatCompletionsResponse.ChoicesDTO();
            choicesDTO.setIndex(chatCompletionChoice.getIndex());
            choicesDTO.setFinishReason(chatCompletionChoice.getFinishReason());
            ChatCompletionsResponse.ChoicesDTO.MessageDTO messageDTO=new ChatCompletionsResponse.ChoicesDTO.MessageDTO();
            messageDTO.setContent(chatCompletionChoice.getMessage().stringContent());
            messageDTO.setRole(chatCompletionChoice.getMessage().getRole().value());
            choicesDTO.setMessage(messageDTO);
            choicesDTOList.add(choicesDTO);
        });
        result.setChoices(choicesDTOList);
        return result;
    }

    public static void main(String[] args) {
        VolcengineArkUtil volcengineArkUtil=new VolcengineArkUtil();
        volcengineArkUtil.init();
        ChatCompletionsResponse result =volcengineArkUtil.getCheckTextByAnalyzeContent("\"live图如何保存到电脑\n" +
                "live图直接保存到电脑有什么好处呢？\n" +
                "[一R] 为相册减负，不用担心相册爆满啦～\n" +
                "[二R] 电脑编辑live视频，不用再从手机传到电脑\n" +
                "[三R] 批量保存到电脑，效率嘎嘎高\n" +
                "\n" +
                "那么，如何才能把live图如何保存到电脑呢\n" +
                "\n" +
                "第一步：复制live笔记链接\n" +
                "第二步：进入素材工具，粘贴链接，获取素材\n" +
                "第三步：选择需要的live保存，支持多个live一键下载哦\n" +
                "\n" +
                "注意啦～电脑上不支持live格式，所以这里下载的是live视频\n" +
                "\n" +
                "#红薯秀 #红薯秀编辑器 #live图怎么保存\"\n");
        System.out.println(JSON.toJSONString(result));
        result =volcengineArkUtil.getCheckTextByAnalyzeContent("深度解析杭马组委会运作机制\n" +
                "杭马，你为什么烂泥扶不上墙？杭马是老牌赛事，1987年就开始办赛，不存在经验不足的情况。但是杭马真的配得上老牌赛事吗？很多人都直摇头，我们几张图解析杭马为什么烂泥扶不上墙。\n" +
                "根据公开采招网站信息显示，杭马所有服务的决策机构，均在浙江省体育局竞赛中心，而不是运营单位。图2、3、4显示，杭马奖牌供应商是警用设备公司，据悉以前只做过警徽，主要业务是生产防爆盾和警棍。杭马官网在23年的供应商是蓦然科技，同时蓦然科技也是浙江省马拉松及路跑协会的供应商，由于众所周知的原因，舆情压力太大，今年花了723000元更换了数字心动报名。\n" +
                "杭马运营商究竟是干什么的？在2022-24经过大丰为首的联合体中标之后，省体育局收获了联合体的70000000收入，运营公司给政府单位收入，在路跑赛事中恐怕也是独一家。运营公司收入来源于赞助商广告收入，三年的收入需要填平如此大窟窿，恐怕也有很大压力#2024杭州马拉松 #杭州马拉松 #马拉松比赛 #马拉松 #路跑赛事典型案例 #路跑赛事 #杭州 #浙江省体育局 #中国田径");
        System.out.println(JSON.toJSONString(result));
    }
}
